package org.funtester.performance.books.chapter04.section4;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * 日志工具类,用于读取日志文件,并计算下一个日志的延迟时间
 */
public class FunLogUtils {

    /**
     * 默认字符集,UTF-8
     */
    static Charset defaultCharset = StandardCharsets.UTF_8;

    /**
     * 日志文件路径,绝对路径
     */
    String path;

    /**
     * 下一个循环的延迟时间,用于日志循环回放
     */
    long nextDelay;

    /**
     * 日志集合,用于存储日志信息
     */
    List<FunLog> logs;

    /**
     * 最小时间戳
     */
    long minTimestamp = Long.MAX_VALUE;

    /**
     * 最大时间戳
     */
    long maxTimestamp = Long.MIN_VALUE;

    public FunLogUtils(String path) {
        this.path = path;
    }

    /**
     * 读取日志文件,并计算下一个日志的延迟时间
     */
    public void readLogs() {
        List<String> logLines = readLog(path);// 读取日志文件,返回日志行集合
        if (logLines != null) {
            logs = new ArrayList<>();// 初始化日志集合
            for (String logLine : logLines) {// 遍历日志行
                FunLog log = new FunLog(logLine);// 创建日志对象
                logs.add(log);// 添加到日志集合
                if (log.timestamp < this.minTimestamp) {// 计算最小时间戳
                    this.minTimestamp = log.timestamp;
                }
                if (log.timestamp > this.maxTimestamp) {// 计算最大时间戳
                    this.maxTimestamp = log.timestamp;
                }
            }
        }
        if (minTimestamp == Long.MAX_VALUE || maxTimestamp == Long.MIN_VALUE) {// 如果时间戳异常
            throw new RuntimeException("时间戳异常,请检查日志文件");
        } else {// 计算下一个循环的延迟时间
            this.nextDelay = (maxTimestamp - minTimestamp) / 1000 * 1000 + 1000L;// 下一个循环的延迟时间
        }
    }


    /**
     * 读取日志文件,返回日志行集合
     * @param path 日志路径,绝对路径
     * @return
     */
    public static List<String> readLog(String path) {
        List<String> result = null;// 返回结果
        try {
            result = Files.readAllLines(Paths.get(path), defaultCharset);// 读取日志文件，返回日志行集合
        } catch (IOException e) {
            System.out.println("读取日志文件失败" + e.getMessage());
        }
        return result;// 返回日志行集合
    }

}
